#include"Arquivo.h"
#include"Lexico.h"
#include"Hash.h"
#include"Sintatico.h"
#include"HashIdentificadores.h"
#include"NoHash.h"
#include"ParametroFormal.h"
#include"Procedimento.h"
#include"VariavelSimples.h"
#include"NoArvore.h"
#include"Semantico.h"
#include "GeradorCodigo.h"


int main()
{
	/*HashIdentificadores hash;
	string a;
	string b;
	a = "fatorial";
	b = "mmc";
	
	VariavelSimples * var = new VariavelSimples();
	VariavelSimples * var1 = new  VariavelSimples();
	var->SetId(a);
	var->SetNivel(0);
	var1->SetId(b);
	var1->SetNivel(1);
	
	hash.Add(var);
	hash.Add(var1);
	
	cout<<"potta"<<endl;
	if(hash.PesquisaVariavelNivel(b, 1))
		cout << "achei"<<endl;
	if(hash.PesquisaVariavelNivel(a, 1))
		cout << "achei"<<endl;
	cout<<"caralho"<<endl;*/
	
	
	Arquivo mArquivo;
	Hash mHash;
	mArquivo.Chaves(mHash);
	Lexico mLexico(mHash);	
	NoArvore mNoArvoreSintatica;
	
	
	
	while( !mArquivo.Fim() )
	{
		mLexico.GetLinha(mArquivo);
		mLexico.Valida();
	}
	if( mLexico.RetFlag() ) //retorna se fechou comentario
	{
			mLexico.InsereErro(3); //inere erro de n�o fechou comentario	
			
	}
	
	//recebe a lista de identificadores do lexico
	ListaIdentificadores mLista; //lista de identificadores passada para o sintatico
	mLexico.RetLista(mLista); //recebe a lista	
	mLexico.mostra();
	
	HashIdentificadores mHashIdentificadores;
	Sintatico mSintatico(mLista, mHashIdentificadores ,mNoArvoreSintatica );//passa a lista para o sintatico afim de ser examinada
	mSintatico.Programa();
	//mSintatico.MostraArvore();
	
	Semantico mSemantico(mNoArvoreSintatica,mHashIdentificadores );
	GeradorCodigo mGerador(mNoArvoreSintatica, mHashIdentificadores, "entrada.mep");
	
	
	return 0;
}
